#include<iostream>
using namespace std;
#include<vector>
#include<unistd.h>
#include<signal.h>


#define MAX_NUM 31
static vector<int> sigarr = {2};//要屏蔽2号信号和3号信号


static void show_pending(const sigset_t& pending){
    for(int i = MAX_NUM;i>=0;i--){
        if(sigismember(&pending,i)){
                cout<<"1";
        }else{
             cout<<"0";
        }
    }
    cout<<"\n";
}

static void handler(int signo){
    cout<<signo<<"号信号已经被递达了"<<endl;
    exit(0);
}

//信号阻塞的测试
int main(){
    signal(2,handler);
    //1:初始化
    sigset_t block,oblock,pending;//要阻塞的信号
    sigemptyset(&block);
    sigemptyset(&oblock);
   // sigemptyset(&pending);
    //1.1:添加要屏蔽的信号
    for(const auto& e :sigarr){
        sigaddset(&block,e);
    }
    //上面的所有接口都还是用户态
    //1.2:设置进内核的位图结构（内核态）
    sigprocmask(SIG_SETMASK,&block,&oblock);//第3个参数是要保留不变的


    //2:如果信号被阻塞了，那么将不会进入抵达，这个时候pending表一直为0
    //2.1:屏蔽10s后恢复信号
    int cnt =10;
    while(true){
        //2.1:初始化pending表
        sigemptyset(&pending);
        //2.2:获取pending表的内容
        sigpending(&pending);
        //2.3：打印出来
        show_pending(pending);
        sleep(1);
        if(cnt-- == 0){
            cout<<"恢复信号，取消对所有信号的屏蔽"<<endl;
            sigprocmask(SIG_SETMASK,&oblock,&block);
        }
    }


    return 0;
}